package concurrent;


/**
 * Der CountUpAndDownLatch ist eine Erweiterung des CountDownLatch. Er ermoeglicht es count
 * sowohl hoch als auch runterzuzählen und mit await darauf zu warten, dass count 0 erreicht
 * @author Patrick Bender, Lukas Subel
 */
public class CountUpAndDownLatch {

	/**
	 * Zaehlt die bisher ausgegebenen Counts
	 */
	private Integer count;
	
	/**
	 * Stellt die Anzahl der ounts ein
	 * @param count Die neue Anzahl an Counts
	 */
	public CountUpAndDownLatch (int count) {
		this.count = count;
	}
	
	/**
	 * Zaehlt die Counts einen runter; informiert die wartenden Threads
	 */
	public synchronized void decrease() {
		count--;
		if (count <= 0) notifyAll();
	}
	
	/**
	 * Zaehlt die Counts um ein hoch
	 */
	public synchronized void increase() {
		count++;
	}
	
	/**
	 * Wartet, bis count bei 0 sind; setzt danach die Programmausfuehrung fort
	 * @throws InterruptedException
	 */
	public synchronized void await() throws InterruptedException {
		while (count > 0)
			wait();
	}
	
}
